package com.guc.coroutines

import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.runBlocking

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*
import kotlin.system.measureTimeMillis

/**
 * Instrumented test, which will execute on an Android device.
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
    @Test
    fun useAppContext() {
        // Context of the app under test.
        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
        assertEquals("com.guc.coroutines", appContext.packageName)
    }

    @Test
    fun testFlow() {
        runBlocking {

            val time = measureTimeMillis {
                flow {
                    for (i in 1..5) {
                        delay(100)
                        emit(i)
                        Log.e("testFlow", "flow: $i .${Thread.currentThread().name}")
                    }
                }.flowOn(Dispatchers.IO)
                    .collect {
                        Log.e("testFlow", "collect: $it .${Thread.currentThread().name}")
                    }
            }
            Log.e("testFlow", "耗时：$time ms.${Thread.currentThread().name}")
        }
    }

}

